package cn.com.support.message;

import cn.com.commons.message.Message;
import cn.com.commons.result.AbstractResult;
import cn.com.commons.utils.StringUtil;

/**
 * 
 * 消息结果,和<code>MessageEumn</code>结合使用，系统中所有的消息都在<code>MessageEumn</code>中进行管理
 * 
 * @param <T>
 * @since 2012-3-10 下午11:53:28
 * @version 1.0
 * @author Microbun
 * 
 */
public class MessageResult<T> extends AbstractResult<T> implements Message {

	private static final long serialVersionUID = 4856869426207602201L;

	/**
	 * 消息, 展示为：未知原因
	 */
	public static final int SHOW_TYPE_MGS = -1;

	/**
	 * 字符代码+消息,展示为：ERROR(0x00000000):未知原因
	 */
	public static final int SHOW_TYPE_STR_MGS = 1;

	/**
	 * 数字代码+消息,展示为：ERROR(NO_REASON):未知原因
	 */
	public static final int SHOW_TYPE_DEX_MSG = 2;

	private final int DEFAULT_SHOW_STYLE = SHOW_TYPE_STR_MGS;

	private MessageCode messageCode;

	private String message;

	// private String

	/**
	 * 默认的消息构造器
	 */
	public MessageResult() {
		this(null);
	}

	/**
	 * 构造一个指定消息结果
	 * 
	 * @param message
	 *            要指定的消息内容
	 */
	public MessageResult(MessageCodeEnum systemCode) {
		this(false, null, systemCode);
	}

	/**
	 * 构造一个指定消息结果
	 * 
	 * @param state
	 *            结果状态
	 * @param data
	 *            结果数据
	 * @param message
	 *            消息内容
	 */
	public MessageResult(boolean state, T data, MessageCodeEnum systemCode) {
		super(state, data);
		if (systemCode == null) {
			systemCode = MessageCodeEnum.NO_REASON;
		}
		this.messageCode = systemCode;
	}

	/**
	 * 构造一个指定消息结果
	 * 
	 * @param state
	 *            结果状态
	 * @param data
	 *            结果数据
	 */
	public MessageResult(boolean state, T data) {
		super(state, data);
	}

	/**
	 * 根据指定的样式返回消息，它包含下面3种样式
	 * <p>
	 * <li>
	 * {@link #SHOW_TYPE_DEX_MSG} 展示为：ERROR(0x00000000):未知原因</li>
	 * <li>
	 * {@link #SHOW_TYPE_STR_MGS} 展示为：ERROR(NO_REASON):未知原因</li>
	 * <li>
	 * {@link #SHOW_TYPE_MGS} 展示为：未知原因</li>
	 * 
	 * @param showStyle
	 *            显示消息的样式
	 * @return 消息类容
	 */
	public String descript(int showStyle) {
		if (SHOW_TYPE_STR_MGS == showStyle) {
			return String.format("%s(%s):%s", messageCode.type(),
					StringUtil.toHexString(messageCode.codenum(), 8),
					messageCode.descript());
		} else if (SHOW_TYPE_DEX_MSG == showStyle) {
			return String.format("%s(%s):%s", messageCode.type(), messageCode,
					messageCode.descript());
		}
		return messageCode.descript();
	}

	/**
	 * 设置消息类容
	 * 
	 * @param state
	 * @param data
	 * @param message
	 */
	public void setMessageResult(boolean state, T data,
			MessageCodeEnum systemCode) {
		setSucceed(state);
		setData(data);
		this.messageCode = systemCode;
	}

	public String code() {
		return messageCode.code();
	}

	public String descript() {
		return descript(DEFAULT_SHOW_STYLE);
	}

	@Override
	public String message() {
		return builidMessage();
	}

	@Override
	public String builidMessage(Object... agrs) {
		// 目前消息内容默认采用消息的描述信息
		if (agrs != null && agrs.length > 0) {
			message=agrs[0].toString();
		}
		if (message == null) {
			message = descript(SHOW_TYPE_MGS);
		}
		return message;
	}

	/**
	 * 为了转化为ajax数据而准备的方法，和{@link #code()}的功能一样
	 * 
	 * @return 编码
	 */
	public String getCode() {
		return code();
	}

	/**
	 * 为了转化为ajax数据而准备的方法，和{@link #descript()}的功能一样
	 * 
	 * @return 描述信息
	 */
	public String getDescirpt() {
		return descript();
	}

	/**
	 * 为了转化为ajax数据而准备的方法，和{@link #message()}的功能一样
	 * 
	 * @return 消息内容
	 */
	public String getMessage() {
		return message();
	}

}
